package cepicam.src.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import cepicam.src.domain.AutoEcole;
import cepicam.src.domain.CategoriePermis;
import cepicam.src.domain.Produit;

public class ProduitDAO extends DAO<Produit>{

	

	private PreparedStatement pstat = null;
	
	private String createProd = "INSERT INTO Produit (lib_prod,quantite,type,id_catPermis) VALUES (?,?,?,?)";  
	private String deleteProd = "DELETE FROM Produit WHERE id_produit=?";
	private String updateProd = "UPDATE Produit SET lib_prod=?,quantite=?,type=? WHERE id_produit = ?";
	private String findProd = "SELECT * FROM Produit as p INNER JOIN categoriepermis as c ON p.id_catPermis = c.id_catPermis WHERE p.id_produit = ?";
	private String listerProd = "SELECT * FROM Produit as p INNER JOIN categoriepermis as c ON p.id_catPermis = c.id_catPermis";
	private String findProdByTypeAndCatP = "SELECT * from Produit as p INNER JOIN categoriepermis as c ON p.id_catPermis = c.id_catPermis WHERE p.id_catPermis = ? AND p.type = ?";
	
	
	public ProduitDAO(){
		
	}
	

	//TODO : gerer le modification de prix pour chaque auto-ecole
	
	//TODO : gerer les exceptions throws SQLException, IllegalArgumentException
	public Produit create(Produit prod) {	
		if (prod == null) throw new IllegalArgumentException("objet est null");
			//TODO: verifier les casts DBvsJava
		
		try{
		pstat = this.connect.prepareStatement(createProd,Statement.RETURN_GENERATED_KEYS);

		pstat.setString(1, prod.getLibelle());		
		pstat.setInt(2, prod.getQuantite());
		pstat.setString(3, prod.getType());
		pstat.setInt(4, prod.getCatp().getId());

		
		pstat.executeUpdate();
		this.connect.commit();
		}catch(SQLException sqle){
			sqle.printStackTrace();
		}
		
		return prod;
	}
		
		
	@Override
	// faire le inner join pour la categorie de permis
	public Produit find(int id) {

		ResultSet result = null;

		Produit prod = null;
		try{
			pstat = this.connect.prepareStatement(findProd);
			pstat.setInt(1, id);
			result = pstat.executeQuery();
			
			while(result.next()){

					prod = new Produit(result.getInt("id_produit"),result.getString("lib_prod"), result.getInt("quantite"),result.getString("type"),
										new CategoriePermis(result.getInt("id_catPermis"), result.getString("lib_catPermis")), new AutoEcole(1, "Cepicam", "BE1234567890"));
					
			}
		}
		catch(SQLException sqle){
			sqle.printStackTrace();
		}

		return prod;
	}


	public Produit update(Produit prod) {
		try {
			//TODO: verifier les casts DBvsJava
		pstat = this.connect.prepareStatement(updateProd,Statement.RETURN_GENERATED_KEYS);
		
		pstat.setString(1, prod.getLibelle());
		pstat.setInt(2, prod.getQuantite());
		pstat.setString(3, prod.getType());
				
		pstat.executeUpdate();
		this.connect.commit();

		}
		catch(SQLException sqle){
			sqle.printStackTrace();
		}
		return prod;
	}


	public Produit delete(Produit prod) {
		
		try {
			//TODO: verifier les casts DBvsJava
		pstat = this.connect.prepareStatement(deleteProd);
		
		pstat.setInt(1, prod.getId());
		
		
		pstat.executeUpdate();
		this.connect.commit();

		}
		catch(SQLException sqle){
			sqle.printStackTrace();
		}
		
		return prod;
	}
	
	public ArrayList<Produit> lister (){
		
		ResultSet result = null;
		ArrayList<Produit> listprod = new ArrayList<Produit>();
		
		Produit prod = null;
		try{
			pstat = this.connect.prepareStatement(listerProd);
			result = pstat.executeQuery();
			
			while(result.next()){
				prod = new Produit(result.getInt("id_produit"),result.getString("lib_prod"), result.getInt("quantite"),result.getString("type"),
						new CategoriePermis(result.getInt("id_catPermis"), result.getString("lib_catPermis")), new AutoEcole(1, "Cepicam", "BE1234567890"));
				listprod.add(prod);
					
			}	
				
		}
		catch(SQLException sqle){
			sqle.printStackTrace();
		}
	
		return listprod;
	}
	
	public ArrayList<Produit> listerParTypeEtCatP (int id_cat, String type){
		ResultSet result = null;
		ArrayList<Produit> listprod = new ArrayList<Produit>();
		
		Produit prod = null;
		try{
			pstat = this.connect.prepareStatement(findProdByTypeAndCatP);
			
			pstat.setInt(1, id_cat);
			pstat.setString(2, type);
			result = pstat.executeQuery();
			
			while(result.next()){
				prod = new Produit(result.getInt("id_produit"),result.getString("lib_prod"), result.getInt("quantite"),result.getString("type"),
						new CategoriePermis(result.getInt("id_catPermis"), result.getString("lib_catPermis")), new AutoEcole(1, "Cepicam", "BE1234567890"));
				listprod.add(prod);
					
			}	
				
		}
		catch(SQLException sqle){
			sqle.printStackTrace();
		}
	
		return listprod;
	}
	

}





